home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-04
/
ddj0492.zip
/
LORENZ.ASC
< prev
next >
Wrap
Text File
|
1992-03-10
|
4KB
|
183 lines
_WINDOWS PROGRAMMING WITH BASIC_
by Raymond J. Schneider
[LISTING ONE]
/* Lorenz Equations in GFA BASIC
/* Copyright 1991 Raymond J. Schneider
XEND=0,YEND=0,ZEND=0 //Initializes end of plot run variables
/* Configure and Open Parent Window
pstyle%= WS_OVERLAPPEDWINDOW
OR pstyle%, WS_CLIPCHILDREN
OR pstyle%, WS_VISIBLE
TITLEW #1, "Lorenz Equations"
PARENTW #1,0,0,_X,_Y,pstyle% //Open full window
/* Configure three child windows
cstyle%=0
cstyle%= WS_SYSMENU
/* Title the windows
TITLEW #2, "Lorenz XY-View"
TITLEW #3, "Lorenz YZ-View"
TITLEW #4, "Lorenz ZX-View"
/* Initalize Menu Structure
DIM m$(15)
m$(0)="&Views" //First Menu Item
m$(1)="&XY-View" // Sub-Menu Items
m$(2)="&YZ-View"
m$(3)="&ZX-View"
m$(4)="" // Null-string terminates sub-menus
m$(5)="&Control"
m$(6)="&Set Parameters"
m$(7)="&GO"
m$(8)=""
m$(9)=""
MENU m$( )
/* Main Program
cww%=_X/2-30,chh%=_Y/2-30
ON MENU MESSAGE GOSUB HandleMessage( )
DO
GETEVENT
IF MENU(1)=20 //Then a Menu Selection Has been Pressed
/* Process Menu Selection
SWITCH MENU(0)
CASE 1 // Open XY-View
CHILDW #2,1,5,5,cww%,chh%,cstyle%
CASE 2 // Open YZ-View
CHILDW #3,1,cww%+8,5,cww%,chh%,cstyle%
CASE 3 // Open ZX-View
CHILDW #4,1,5,chh%+8,cww%,chh%,cstyle%
CASE 6 //Set-Parameters
EXIT IF DLGRV&<>0
SetDialog()
DO
SLEEP
UNTIL DLGRV&
TEXT 0,0,"Sigma="+STR$(SIGMA)
TEXT 0,12,"Rho= "+STR$(RHO)
TEXT 0,24,"B= "+STR$(B)
CASE 7 // Calculate Lorenz and Plot in Windows
TOPW #2
IF XEND=0 //Initialization of starting conditions X,Y,Z
X=1
ELSE
X=XEND
ENDIF
IF YEND=0
Y=1
ELSE
Y=YEND
ENDIF
IF ZEND=0
Z=1
ELSE
Z=ZEND
ENDIF
PlotLorenz(X,Y,Z,100,1)
TOPW #3
PlotLorenz(X,Y,Z,100,2)
TOPW #4
PlotLorenz(X,Y,Z,100,3)
ENDSWITCH
ENDIF
IF MENU(1)=4
SWITCH MENU(14)
CASE 2
CLOSEW #2
CASE 3
CLOSEW #3
CASE 4
CLOSEW #4
ENDSWITCH
ENDIF
EXIT IF MENU(1)=4 && MENU(14)=1
LOOP
CLOSEW #1
END
PROCEDURE HandleMessage( )
IF DLG(1)=MENU(15)
ENDIF /*Discard General Messages
DLGRV&=0
hw%=GetParent(MENU(15))
IF hw%=DLG(1)
SWITCH MENU(6)
CASE 100
IF MENU(1)=30
GetText(1,101,SIGMA$)
GetText(1,102,RHO$)
GetText(1,103,B$)
SIGMA=VAL(SIGMA$),RHO=VAL(RHO$),B=VAL(B$)
DLGRV&=MENU(6)
ENDIF
ENDSWITCH
ENDIF
RETURN
PROCEDURE GetText(d|,di&,VAR a$)
LOCAL buffer$
buffer$=SPACE$(100)
IF GetWindowText(DLGITEM(d|,di&),V:buffer$,LEN(buffer$))>0
a$=CHAR{V:buffer$}
ELSE
a$=""
ENDIF
RETURN
PROCEDURE SetDialog()
s%=WS_TABSTOP
sb%=s%
sb%|=BS_DEFPUSHBUTTON
seb%=s%
seb%|=WS_BORDER
seb%|=ES_UPPERCASE
~SetFocus(DLGITEM(1,100))
DLGRV&=0
DIALOG #1,325,175,300,160,"Set Parameters"
DLGBASE UNIT
DEFPUSHBUTTON "OK",100,80,65,14,12,sb%
EDITTEXT "",101,80,10,40,12,seb%
EDITTEXT "",102,80,30,40,12,seb%
EDITTEXT "",103,80,50,40,12,seb%
RTEXT "SIGMA",104,10,10,55,12
RTEXT "RHO",105,10,30,55,12
RTEXT "B",106,10,50,55,12
ENDDIALOG
SHOWDIALOG #1
RETURN
PROCEDURE PlotLorenz(X,Y,Z,N%,I%)
/* SIGMA, RHO, B assumed Global
LOCAL LX,LY,LZ,LX1,LY1,LZ1,DT,j%
LOCAL DX,DY,DZ
PX=_X/4+50,PY=_Y/4+10 // Plot Offsets
LX=X,LY=Y,LZ=Z,DT=.01
FOR j%=1 TO N%
DX=SIGMA*(LY-LX)*DT
DY=(-LX*LZ+RHO*LX-LY)*DT
DZ=(LX*LY - B*LZ)*DT
LX1=LX+DX
LY1=LY+DY
LZ1=LZ+DZ
SWITCH I%
CASE 1 //PLOT XY
LINE LX+PX,LY+PY,LX1+PX,LY1+PY
CASE 2 //PLOT YZ
LINE LY+PX,LZ+PY,LY1+PX,LZ1+PY
CASE 3 //PLOT ZX
LINE LZ+PX,LX+PY,LZ1+PX,LX1+PY
ENDSWITCH
LX=LX1,LY=LY1,LZ=LZ1 // Update function
NEXT j%
XEND=LX,YEND=LY,ZEND=LZ
RETURN